// 这个文件被用于管理运营方的相关信息
// 为什么不命名为“公司”，是因为铁路的运营方不一定是公司
#pragma once
#include "locomotives.hpp"
#include "railroad_car.hpp"
#include "tech_spec_lib.hpp"
#include "track.hpp"
#include "train.hpp"
#include <string>
#include <vector>

class OperatorAssets {
private:
    // 现金
    unsigned long long cash;
    // 以下为各种要素的列表
    // 列表中的id与项目的id为一一对应的关系！
    // 机车列表
    std::vector<Locomotive *> locomotives;
    // 车厢列表
    std::vector<RailroadWagon *> wagons;
    // 路段列表
    std::vector<Track *> tracks;

public:
    // 技术库
    TechSpecificationLibrary *techSpecificationLibrary;
    OperatorAssets() {
        cash = 0;
        this->techSpecificationLibrary = new TechSpecificationLibrary();
    };
    // 轨道数量
    int tracksCount() { return this->tracks.size(); };
    // 机车数量
    int locomotivesCount() { return this->locomotives.size(); };
    // 车厢数量
    int wagonsCount() { return this->wagons.size(); };
    // 创建轨道
    Track *createTrack(fp_type length, fp_type speedLimit);
    // 获取一段轨道
    Track *getTrack(int id) { return this->tracks.at(id); };
    // 创建机车
    // locoClass: 机车类型名称，如hxn3c
    // locoName: 机车名称，如hxn3c-1
    Locomotive *createLocomotive(std::string locoClass, std::string locoName);
    // 创建电力机车
    ElectricLocomotive *createElectricLocomotive();
    // 获取机车，越界则应该报错
    Locomotive *getLocomotive(int id) { return this->locomotives.at(id); };
    // 创建车厢
    RailroadWagon *createWagon(std::string wagonClass, std::string wagonName);
    // 获取机车，越界则应该报错
    RailroadWagon *getWagon(int id) { return this->wagons.at(id); };
};

// 铁路运营方当前的状态，比如列车信息等
// 这个里面的数据是动态变化的，可能涉及不少内存分配-释放的问题
class RailroadOperatorStates {
private:
    // 列车列表
    std::vector<Train *> trains;

public:
    RailroadOperatorStates(){};
    // 创建一个火车
    Train *createTrain();
};

// 铁路运营方对象
// 这类对象基本贯穿整个程序的生命周期，因此通常不太需要释放内存
class RailroadOperator {
private:
    std::string name; // 运营方名称

public:
    OperatorAssets *assets; // 资产
    RailroadOperator(std::string name) : name(name) {
        assets = new OperatorAssets();
    }
};